// 引入 mysql 数据库连接依赖
const mysql = require("mysql");

// 创建 mysql 连接池并配置参数
const pool = mysql.createPool({
    host: "192.168.200.100",    // 主机地址
    port: 3306,                 // 端口
    user: "root",               // 数据库访问账号
    password: "920619",         // 数据库访问密码
    database: "test",           // 要访问的数据库
    charset: "UTF8_GENERAL_CI", // 字符编码 ( 必须大写 )
    typeCast: true,             // 是否把结果值转换为原生的 javascript 类型
    supportBigNumbers: true,    // 处理大数字 (bigint, decimal), 需要开启 ( 结合 bigNumberStrings 使用 )
    bigNumberStrings: true,     // 大数字 (bigint, decimal) 值转换为javascript字符对象串
    multipleStatements: false,  // 允许每个mysql语句有多条查询, 未防止sql注入不开启
    //connectTimeout: 5000,     // 数据库连接超时时间, 默认无超时
});
pool.connectionLimit = 10;      // 连接池中可以存放的最大连接数量
pool.waitForConnections = true; // 连接使用量超负荷是否等待, false 会报错
pool.queueLimit = 0;            // 每个连接可操作的 列数 上限, 0 为没有上限

// 对外暴漏从连接池中获取数据库连接的方法
module.exports = function () {
    return new Promise((resolve, reject) => {
        pool.getConnection((err, conn) => {
            if (err) {
                console.log("数据库连接获取失败");
            } else {
                resolve(conn);
            }
        });
    });
};




// 声明一个同步方法, 这里要求有 SQL 语句的基础
// 在 beginTransaction 和 commit 之间可以执行多次 query 方法
let ceshi = async function () {
    // 获取连接
    let conn = await mysqlUtil();
    // 开启事物
    await new Promise((resolve, reject) => {
        conn.beginTransaction(err => {
            if (err) {
                reject(err);
            } else {
                resolve();
            }
        });
    });
    // 执行第一个 SQL 语句
    let result1 = await new Promise((resolve, reject) => {
        let sqlStr = "INSERT INTO user (UserName, UserSex) values (?, ?)";
        let sqlParam = ["姓名2", 0];
        conn.query(sqlStr, sqlParam, function (err, ret) {
            if (err) {
                // 回滚之前的数据库操作, 直至碰到 beginTransaction
                return conn.rollback(() => {
                    resolve(err);
                });
            }
            resolve(ret);
        });
    });
    console.log(result1);
    // 执行第二个 SQL 语句
    let result2 = await new Promise((resolve, reject) => {
        let sqlStr = "SELECT * FROM user";
        //let sqlStr = "SELEC * FROM user"; // 错误的 SQL 语句
        conn.query(sqlStr, function (err, ret) {
            if (err) {
                // 回滚之前的数据库操作, 直至碰到 beginTransaction
                return conn.rollback(() => {
                    resolve(err);
                });
            }
            resolve(ret);
        });
    });
    console.log(result2);
    // 关闭事务
    await new Promise((resolve, reject) => {
        conn.commit(err => {
            if (err) {
                reject(err);
            } else {
                resolve();
            }
        });
    });
};

// 调用测试方法
ceshi();